非对称加密算法RSA简介
先来回顾一下”非对称加密算法”的概念, 以下引用自阮一峰的博客:
(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
(2)甲方获取乙方的公钥,然后用它对信息加密。
(3)乙方得到加密后的信息,用私钥解密。
如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的”非对称加密算法”。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。
一, 使用GnuPG
GnuPG(英文:GNU Privacy Guard,简称:GPG)
GnuPG使用用户自行生成的非对称密钥对来加密信息,由此产生的公钥可以同其他用户以各种方式交换,如密钥服务器。GnuPG还可以向信息添加一个加密的数字签名,这样,收件人可以验证信息完整性和发件人。 (来自维基百科)
下面介绍使用GnuPG 实现电子邮件加密和数字签名, 参考了阮一峰的博客, 注意下面关于gpg工具的介绍都是基于命令行的, 其实Gnome和KDE都自带了图形化的密钥管理工具(分别是Seahorse和Kgpg), 这样在新建/管理自己的密钥&& 使用他人的公钥会更加简单, 但是下面我们介绍的还是使用命令行的gpg.
1.1 安装GnuPG
在Fedora/CentOS上使用yum安装GnuPG: sudo yum install gnupg
如果通过源码编译的方式, 可以在这里获取源码. 编译方式三步:
./configure
make
make install
1.2 生成密钥:
输入gpg --gen-key
命令生成密钥, 回车后会提示需要生成的密钥类型, 例如:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
选择第一个, 表示加密和签名都是RSA算法. 然后命令行提示所需密钥的长度(1024~4096位), 我们这里选择2048(默认值).
接着是设定密钥有效期, 这里选择”0”, 表示永不过期.
然后是提供个人信息, 包括 姓名, 邮箱, 注释, 其中前两项姓名 && 邮箱是必要的, 注释可以不填写, 输入完成之后gpg会生成一个”用户ID”, 下面是一个生成ID的范例:
“Heinrich Heine heinrichh@duesseldorf.de“
确认自己的”用户ID”之后, 系统还会要求输入一个私钥的密码, 防止他人使用自己的私钥.
You need a Passphrase to protect your secret key.
Enter passphrase: #提示要求输入私钥密码
最后系统开始生成密钥, 期间可能要求你产生一些”随机数”, 解释如下:
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
几分钟后密钥生成, 然后会提示如下:
gpg: key 9A69C57C marked as ultimately trusted
public and secret key created and signed.
注意上面的字符串”9A69C57C”,这是我的”用户ID”的Hash字符串,可以用来替代”用户ID”。
1.3 管理密钥
1.3.1 查看/删除密钥
列出系统中存储的密钥: gpg --list-keys
删除某个密钥: gpg --delete-key [用户ID]
, “用户ID”可以是邮件地址或者Hash字符串.
1.3.2 密钥的导出和存储
公钥的二进制文件存储在~/.gnupg/pubring.gpg
将公钥以ASCII码显示并存储到文本文件public-key.txt中: gpg --armor --output public-key.txt --export [用户ID]
备份自己的公钥: gpg -o public-key --export [用户ID]
, 其中-o参数后面是导出的公钥文件名字.
备份自己的私钥 : gpg -oa seckey.asc --export-secret-keys [用户ID]
,其中-oa参数后面就是导出的私钥, 可以在其他机器上通过gpg --import seckey.asc
导入.
1.3.3 发布公钥
因特网上有很多免费的公钥服务器, 你可以把自己的公钥发布到任意一个服务器, 这些服务器之间会互相同步. 命令gpg --send-keys [用户ID] --keyserver hkp://subkeys.pgp.net
1.3.4 获取他人的公钥
通过email地址获取他人的公钥, gpg --keyserver hkp://subkeys.pgp.net --search-keys [用户ID]
.
由于公钥服务器没有审查机制, 也就是说任何人都能用你的email名义上传公钥, 获取到他人的公钥后, 还要验证下此公钥的指纹: gpg --fingerprint [用户ID]
, 然后可以通过电话/短信/QQ向对方确认指纹, 如果指纹一致就能确认这个公钥是对方所分发的.
1.4 使用密钥
1.4.1 使用公钥加密文件
使用对方的公钥加密文件:gpg --recipient [用户ID] --output file.en.txt --encrypt file.txt
.
参数解释: recipient参数指定接收者的公钥,output参数指定加密后的文件名,encrypt参数指定源文件。
1.4.2 解密文件
对方收到加密文件以后用自己的私钥解密:gpg --decrypt file.en.txt --output file.de.txt
参数解释: decrypt参数指定需要解密的文件,output参数指定解密后生成的文件。
1.4.3 对文件进行签名
签名的意思就是”证明是公钥所有者分发的”, 命令为gpg --sign file.txt
. 运行上面的命令后,当前目录下生成file.txt.gpg文件,这就是签名后的文件.
1.4.4 验证签名
gpg --verify file.txt.asc file.txt
1.4.4 密钥和邮件客户端的使用
使用Gnome邮件客户端Evo对邮件进行加密和签名: 参考使用 GnuPG 实现电子邮件加密和数字签名——PGP 30分钟简明教程第四部分.